10   ' *** (FFT08.01A) 16 POINT FFT ***

12 SCREEN 9, 1, 1: COLOR 15, 1: CLS

20 Q = 16: Q2 = Q / 2: DIM Y(Q), FC(Q), FS(Q), KC(Q), KS(Q)

30 PI = 3.141592653589793#: P2 = 2 * PI: K1 = P2 / Q

40 FOR I = 0 TO Q: KC(I) = COS(K1 * I): KS(I) = SIN(K1 * I): NEXT

50 PRINT SPC(30); "MAIN MENU": PRINT : PRINT

60 PRINT SPC(5); "1 = ANALYZE 7 COMPONENT TRIANGLE": PRINT

62 PRINT SPC(5); "2 = EXIT": PRINT

70 PRINT SPC(10); "MAKE SELECTION :";

80 A$ = INKEY$: IF A$ = "" THEN 80

90 A = VAL(A$): ON A GOSUB 600, 990

95 CLS : GOTO 50

99   '  *******************

100   ' *** FFT ROUTINE ***

108   ' *** STAGE A ***

110 A0(0) = (Y(0) + Y(8)) / 2

111 A0(1) = (Y(0) - Y(8)) / 2

112 A1(0) = (Y(1) + Y(9)) / 2

113 A1(1) = (Y(1) - Y(9)) / 2

114 A2(0) = (Y(2) + Y(10)) / 2

115 A2(1) = (Y(2) - Y(10)) / 2

116 A3(0) = (Y(3) + Y(11)) / 2

117 A3(1) = (Y(3) - Y(11)) / 2

118 A4(0) = (Y(4) + Y(12)) / 2

119 A4(1) = (Y(4) - Y(12)) / 2

120 A5(0) = (Y(5) + Y(13)) / 2

121 A5(1) = (Y(5) - Y(13)) / 2

122 A6(0) = (Y(6) + Y(14)) / 2

123 A6(1) = (Y(6) - Y(14)) / 2

124 A7(0) = (Y(7) + Y(15)) / 2

125 A7(1) = (Y(7) - Y(15)) / 2

126   ' *** STAGE B ***

127 BC0(0) = (A0(0) + A4(0)) / 2

128 BC0(1) = A0(1) / 2: BS0(1) = A4(1) / 2

129 BC0(2) = (A0(0) - A4(0)) / 2

130 BC0(3) = A0(1) / 2: BS0(3) = -A4(1) / 2

131 BC1(0) = (A1(0) + A5(0)) / 2

132 BC1(1) = A1(1) / 2: BS1(1) = A5(1) / 2

133 BC1(2) = (A1(0) - A5(0)) / 2

134 BC1(3) = A1(1) / 2: BS1(3) = -A5(1) / 2

135 BC2(0) = (A2(0) + A6(0)) / 2

136 BC2(1) = A2(1) / 2: BS2(1) = A6(1) / 2

137 BC2(2) = (A2(0) - A6(0)) / 2

138 BC2(3) = A2(1) / 2: BS2(3) = -A6(1) / 2

139 BC3(0) = (A3(0) + A7(0)) / 2

140 BC3(1) = A3(1) / 2: BS3(1) = A7(1) / 2

141 BC3(2) = (A3(0) - A7(0)) / 2

142 BC3(3) = A3(1) / 2: BS3(3) = -A7(1) / 2

148   ' *** STAGE C ***

150 FOR I = 0 TO 3: J = 2 * I

151 C1(I) = (BC0(I) + BC2(I) * KC(J) - BS2(I) * KS(J)) / 2

152 C2(I) = (BC1(I) + BC3(I) * KC(J) - BS3(I) * KS(J)) / 2

153 S1(I) = (BS0(I) + BC2(I) * KS(J) + BS2(I) * KC(J)) / 2

154 S2(I) = (BS1(I) + BC3(I) * KS(J) + BS3(I) * KC(J)) / 2

155 NEXT I

160 FOR I = 4 TO 7: J = 2 * I: K = I - 4

161 C1(I) = (BC0(K) + BC2(K) * KC(J) - BS2(K) * KS(J)) / 2

162 C2(I) = (BC1(K) + BC3(K) * KC(J) - BS3(K) * KS(J)) / 2

163 S1(I) = (BS0(K) + BC2(K) * KS(J) + BS2(K) * KC(J)) / 2

164 S2(I) = (BS1(K) + BC3(K) * KS(J) + BS3(K) * KC(J)) / 2

165 NEXT I

168   ' *** STAGE F ***

170 FOR I = 0 TO Q2 - 1

172 FC(I) = (C1(I) + C2(I) * KC(I) - S2(I) * KS(I)) / 2

174 FS(I) = (S1(I) + C2(I) * KS(I) + S2(I) * KC(I)) / 2

176 NEXT

180 FOR I = Q2 TO Q - 1

182 FC(I) = (C1(I - Q2) + C2(I - Q2) * KC(I) - S2(I - Q2) * KS(I)) / 2

184 FS(I) = (S1(I - Q2) + C2(I - Q2) * KS(I) + S2(I - Q2) * KC(I)) / 2

186 NEXT

188 RETURN ' *** END FFT ROUTINE ***

200 ' ****  PRINT OUT RESULTS  ****

202 CLS : PRINT "FREQ   F(COS)       F(SIN)       ";

206 PRINT "FREQ   F(COS)       F(SIN)": PRINT : PRINT

210 FOR Z = 0 TO Q2 - 1

215 GOSUB 300

220 NEXT Z

222 PRINT : PRINT "TIME ="; T9 / 1000

225 PRINT : PRINT : INPUT "C/R TO CONTINUE:"; A$

230 RETURN   ' *** END PRINT ROUTINE ***

235   '        ***********************

300 PRINT USING "##"; Z; : PRINT "   ";

310 PRINT USING "+##.#####"; FC(Z); : PRINT "    ";

312 PRINT USING "+##.#####"; FS(Z); : PRINT "      ";

320 PRINT USING "##"; Z + Q2; : PRINT "   ";

322 PRINT USING "+##.#####"; FC(Z + Q2); : PRINT "    ";

324 PRINT USING "+##.#####"; FS(Z + Q2)

330 RETURN

400   ' GENERATE 7 COMPONENT TRIANGLE

410 FOR I = 0 TO Q: Y(I) = 0

420 FOR J = 1 TO Q / 2 STEP 2: Y(I) = Y(I) + COS(K1 * J * I) / (J * J): NEXT

430 NEXT

440 RETURN

600   ' *****  ANALYZE 7 COMPONENT TRIANGLE *****

610 GOSUB 400 ' GENERATE INPUT FUNCTION

620 T9 = TIMER

622 FOR Z = 1 TO 1000

624 GOSUB 100 ' TRANSFORM FUNCTION

626 NEXT Z

628 T9 = TIMER - T9

630 GOSUB 200 ' PRINTOUT RESULTS

640 RETURN

990 END



